import 'dart:io';
//import 'package:cookie_jar/cookie_jar.dart';
import 'package:dio/dio.dart';
import 'package:dio/io.dart';
import 'package:eh_mobile/common/store/config_store.dart';
import 'package:eh_mobile/common/store/index.dart';
import 'dart:async';
export 'package:dio/dio.dart' show DioError;
import '../../../global.dart';
import '../index.dart';
//import 'package:dio_cookie_manager/dio_cookie_manager.dart';

// 网络请求封装
class Network {
  static final Network instance = Network._internal();

  factory Network() {
    return instance;
  }

  late Dio dio;

  Network._internal() {
    // BaseOptions、Options、RequestOptions 都可以配置参数，优先级别依次递增，且可以根据优先级别覆盖参数
    BaseOptions options = BaseOptions(
      // 请求基地址,可以包含子路径
      baseUrl: BASE_URL,
      // baseUrl: storage.read(key: STORAGE_KEY_APIURL) ?? SERVICE_API_BASEURL,
      //连接服务器超时时间，单位是毫秒.
      connectTimeout: const Duration(seconds: 30),
      // 响应流上前后两次接受到数据的间隔，单位为毫秒。
      receiveTimeout: const Duration(seconds: 30),
      // Http请求头.
      headers: {
        // 'Host': "10.0.0.22:8188",
        // 'Content-Type': 'application/json',
        // 'Cookie': 'WSTOKEN=pyixAkJRHze7B4AhYbmrDZPRNxtCQAMW; Path=/',
      },

      /// 请求的Content-Type，默认值是"application/json; charset=utf-8".
      /// 如果您想以"application/x-www-form-urlencoded"格式编码请求数据,
      /// 可以设置此选项为 `Headers.formUrlEncodedContentType`,  这样[Dio]
      /// 就会自动编码请求体.
      contentType: 'application/json; charset=utf-8',

      /// [responseType] 表示期望以那种格式(方式)接受响应数据。
      /// 目前 [ResponseType] 接受三种类型 `JSON`, `STREAM`, `PLAIN`.
      /// 默认值是 `JSON`, 当响应头中content-type为"application/json"时，dio 会自动将响应内容转化为json对象。
      /// 如果想以二进制方式接受响应数据，如下载一个二进制文件，那么可以使用 `STREAM`.
      /// 如果想以文本(字符串)格式接收响应数据，请使用 `PLAIN`.
      responseType: ResponseType.json,
    );
    dio = Dio(options);
    // 添加缓存插件
    dio.interceptors.add(Global.netCache);
    // 添加cookie管理插件
    // final cookieJar = CookieJar();
    // dio.interceptors.add(CookieManager(cookieJar));
    // 在调试模式下需要抓包调试，所以我们使用代理，并禁用HTTPS证书校验
    // if (!Global.isRelease) {
    //   dio.httpClientAdapter. =
    //       (client) {
    //  // 代理工具会提供一个抓包的自签名证书，会通不过证书校验，所以我们禁用证书校验
    //   client.badCertificateCallback =
    //   (X509Certificate cert, String host, int port) => true;
    //   };
    // }

    // (dio.httpClientAdapter as IOHttpClientAdapter).onHttpClientCreate =
    //     (HttpClient client) {
    //   client.findProxy = (uri) {
    //     return 'PROXY 172.16.60.66:8888';
    //   };
    // };
    // prepareJar();
  }

  // 持久化cookie
  Future<void> prepareJar() async {
    // final Directory appDocDir = await getApplicationDocumentsDirectory();
    // final String appDocPath = appDocDir.path;
    // final jar = PersistCookieJar(
    //   ignoreExpires: false,
    //   storage: FileStorage(appDocPath + "/.cookies/"),
    // );

    // dio.interceptors.add(CookieManager(jar));
  }

  /*
  POST请求
  path 请求链接
  param 请求参数
  cache 是否需要缓存 默认false
  refresh 是否为刷新数据 默认false
  */
  Future<dynamic> post(String path,
      {String method = 'POST',
      Map<String, dynamic>? param,
      Options? options,
      bool cache = false,
      bool refresh = false,
      bool list = false,
      String cacheKey = '',
        Map<String, dynamic>? headers}) async {
    return request(path,
        param: param,
        cache: cache,
        refresh: refresh,
        list: list,
        cacheKey: cacheKey,
        method: 'POST',headers: headers);
  }

  /*
  GET请求
  path 请求链接
  param 请求参数
  cache 是否需要缓存 默认false
  refresh 是否为刷新数据 默认false
  */
  Future<dynamic> get(String path,
      {String method = 'POST',
      Map<String, dynamic>? param,
      Options? options,
      bool cache = false,
      bool refresh = false,
      bool list = false,
      String cacheKey = ''}) async {
    return request(path,
        param: param,
        cache: cache,
        refresh: refresh,
        list: list,
        cacheKey: cacheKey,
        method: 'GET');
  }

  /*
  请求封装
  path 请求链接
  param 请求参数
  cache 是否需要缓存 默认false
  refresh 是否为刷新数据 默认false
  list 是否为列表数据 默认false
  cacheKey 是否为刷新数据 默认false
  */
  Future<dynamic> request(String path,
      {String method = 'POST',
      Map<String, dynamic>? param,
      Options? options,
      bool cache = false,
      bool refresh = false,
      bool list = false,
      String cacheKey = '',
        Map<String, dynamic>? headers
      }) async {
    Options requestOptions = options ?? Options();
    requestOptions.extra ??= <String, dynamic>{};
    requestOptions.headers={};
    requestOptions.extra!.addAll({
      'cache': cache,
      'refresh': refresh,
      'list': list,
      'cacheKey': cacheKey
    });
    requestOptions.method = method;
    if(headers!=null){
      requestOptions.headers?.addAll(headers);
    }
    Map<String, dynamic> netParam={};

    if (param != null) {
      netParam.addAll(param);
    }
    var response;
    try{
      response = await dio.request(path, data: netParam, options: requestOptions);
      return response;
   } on DioException catch( e){
      return e.response?.data;
   }finally{

    }

  }
}
